package com.board.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

@Component
public class RedisUtil {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;
    @Autowired
    private RedisTemplate<String,Object> redisObjectTemplate;

    /**
     * 存入字符串类型的数据（无过期时间）
     */
    public void setString(String key,String value){
        stringRedisTemplate.opsForValue().set(key,value);
    }

    /**
     *存入字符串类型的数据(有过期时间)
     */
    public void setString(String key,String value,long timeout){
        stringRedisTemplate.opsForValue().set(key,value,timeout, TimeUnit.SECONDS);
    }

    /**
     * 查询某个key是否存在于redis中
     */
    public boolean exists(String key){
        return stringRedisTemplate.hasKey(key);
    }

    /**
     * 字符串值加1，用于判断24小时发送5次
     */
    public void codeSendTimeIncr(String key){
        stringRedisTemplate.opsForValue().increment(key);
    }

    /**
     * 获取字符串类型的值
     */
    public String getString(String key){
        return stringRedisTemplate.opsForValue().get(key);
    }

    /**
     * 删除redis中的数据
     */
    public void del(String key){
        stringRedisTemplate.delete(key);
    }

    /**
     * 往zset集合中添加数据
     */
    public void zadd(String key,String value,double score){
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }

    /**
     * 查询zset集合中某个数据的排序值(即查询集合中某个数据是否存在)
     */
    public Double zscore(String key,String value){
        return stringRedisTemplate.opsForZSet().score(key,value);
    }

    /**
     * zset集合中的排序值加1
     */
    public void zincr(String key,String value,double score) {
        stringRedisTemplate.opsForZSet().incrementScore(key, value, score);
    }

    /**
     * 删除zset集合中的某个数据
     */
    public void zrem(String key,String value){
        stringRedisTemplate.opsForZSet().remove(key,value);
    }

    /**
     * 查询zset中的范围数据(排序值倒序)
     */
    public Set<String> zrevRange(String key, Integer start, Integer end){
        return stringRedisTemplate.opsForZSet().reverseRange(key, start, end);
    }

    /**
     * 查询zset集合中的数据条数
     */
    public Long zCard(String key){
        return stringRedisTemplate.opsForZSet().zCard(key);
    }

    /**
     * 添加一条hash数据，值可以有多个
     */
    public void hmset(String key, Map<Object,Object> map){
        stringRedisTemplate.opsForHash().putAll(key,map);
    }
    /**
     * 添加一组键值数据到hash的某个键中
     */
    public void hset(String key,String litKey,String value){
        stringRedisTemplate.opsForHash().put(key,litKey,value);
    }
    /**
     * 自增hash的数据key对应数据
     */
    public void hincrby(String key,String litKey,Integer number){
        stringRedisTemplate.opsForHash().increment(key,litKey,number);
    }
    /**
     * 取出hash的数据key对应数据
     */
    public Object hget(String key,String litKey){
        return stringRedisTemplate.opsForHash().get(key,litKey);
    }

    /**
     * 取出hash的所有数据
     */
    public Map<Object, Object> hgetall(String key){
        return stringRedisTemplate.opsForHash().entries(key);
    }

    /**
     * 通过RedisTemplate往redis中存储对象数据,没有过期时间
     */
    public void setObject(String key,Object value){
        redisObjectTemplate.opsForValue().set(key,value);
    }

    /**
     * 通过RedisTemplate往redis中存储对象数据,有过期时间
     */
    public void setObject(String key,Object value,long seconds){
        redisObjectTemplate.opsForValue().set(key,value,seconds,TimeUnit.SECONDS);
    }

    /**
     * 通过RedisTemplate往redis中取对象数据
     */
    public Object getObject(String key){
        return redisObjectTemplate.opsForValue().get(key);
    }



}
